延續前一天的基本移動,今天的目標是完成角色跳躍設定。
跳躍設定在2D橫向卷軸遊戲中可說是個畫龍點睛的功能。跳躍能為遊戲增添垂直方向操作的樂趣,透過不一樣的跳躍高度、跳躍節奏都能帶給玩家不一樣的體驗。而今天的文章將會先帶入最基本的跳躍,進而補充我在BlueRemedy中針對跳躍設計的操作細節。
首先快速設定好基本版的跳躍:
先創立以下三個變數
為甚麼要特別設定touchGround呢? 他的意思就像我們要踩在地上才能往上跳,假如現在已經騰空了還能跳躍嗎,答案肯定是不行的。
接下來設定touchGround的判斷,如同前一天說的,我習慣將功能包在函式中以便修改。這裡我創建一個PointCheck函式用來做所有偵測工作,並在Update函式中不斷呼叫。
因為這個偵測工作不像Move那麼要求固定更新頻率所以放在Update就可以了。
在PointCheck函式中使用Physics2D.OverlapCircle功能,他是甚麼意思呢? 就是以footPoint (剛設定的腳下的點)為中心,畫半徑0.15單位的圓,偵測圓內有沒有"Ground & Wall"或"Platform"這兩個Layer的物件,並將結果true/false回傳給touchGround變數。
大概是下面這張圖的概念,特別在腳下畫了個圓型框以便理解。這個圓的半徑需要不斷嘗試才能找到適當的值。如果太大,腳色還沒碰到地上就又可以起跳了;如果太小,就得等主角真的完全碰到地板才能再起跳,對於操作的靈活度是大大扣分。
再設一個Jump函數並用FixedUpdate持續呼叫,函式中設定當Jump按鍵按下且是觸地狀態時,施予一個向上的力。
到這邊為止最基礎的跳躍完成了,看看成果吧
實際操作後發現一個小問題,因為關卡中的地形並不是完全平的,移動時有可能會因此騰空,這也導致騰空時沒辦法立即跳躍。聽起來很符合物理對吧,但在遊戲中這很影響操作體驗!
接下來將針對這個問題做改造。宣告一個新的布林變數canJump,觸地時設為true;非跳躍的騰空時,過小小段時間才會變為false,作為緩衝。
然後作以下更改,當touhGround時設定canJump為true,並且Jump函式中跳躍的條件從touhGround改為canJump。跳起時設定canJump為false
創建一個IEnumerator函式canJump_dead(),當touchGround為false時呼叫。IEnumerator真的超好用,它的特點就是能做到類似背後執行,例如下圖中我呼叫後他會等待0.2秒後才作後續動作,不懂的人自己去查資料!
但尷尬的是,也可能造成以下狀況:騰空的瞬間他開始計時,然而只騰空0.1秒就又落地,當到達0.2秒時即使主角正踩在地上,依樣會被設定canJump=false,所以需要再一個機制控制當他落地時立刻停止運作中的計時。
宣告一個Coroutine cor_canJump_dead,當呼叫IEnumerator函式時把他指定到Coroutine變數中。
然後在設定當落地時,假如正在計時(即cor_canJump_dead!=null),就將他強制停止。還有要設定為如果已經開始在計時了就不再呼叫計時